2020712755, 스마트팩토리융합학과 이서영

1) 가급적 주어진 스켈레톤 코드를 활용하였습니다.
2) cv2.imshow를 하면 jupyter상에서는 또 다른 화면으로 출력되어서 matplotlib으로 이미지를 보기 편하게 병합하였습니다.

문제 1

1‐1. Translation, Rotation, Similarity Transformation 행렬을 구성하고, OpenCV Library의 cv2.warpAffine 함수를 이용하여 임의의 이미지에 적용해 변형해보시오.

image는 Grayscale로 적용하였습니다.
마지막 median Blur에서 channel이 3인 경우를 처리할때, 제 코드에서 sort 에러가 발생하는데 이를 처리하지 못했기 때문입니다.
이 점 양해부탁드립니다.

나머지 부분은 문제 요구사항대로 처리하였으나, similarity transformation에서 scale 처리에서 에러가 나서 이 부분은 처리하지 못했습니다.

[문제 2. Linear Filters (35 pts)]

2‐1. Average Filter와 Sharpening Filter를 구성하고, OpenCV Library의 cv2.filter2D 함수를 이용하여 임의의 이미지에 적용해보시오. 이 때, 필터의 크기 혹은 필터의 구성은 자유롭게 정해도 됩니다.

Sharpening Filter도 역시 Kenrnel의 사이즈 결정해야합니다.
Kernel은 중앙에 위치한 행렬의 요소가 2인 행렬(Kernel과 동일한 사이즈이며,
1이면 원본과 동일한 이미지, 2이면 강조된 이미지)에서 모든 요소가 1/mean인 Kernel로 빼주면 됩니다.
이렇게 되면 가운데는 더욱 부각되고 나머지는 덜 부각시킴으로써 경계선 부근이 더욱 부각되도록 하는 효과를 줍니다.

2‐2. Gaussian Filter를 구성하고, OpenCV Library의 cv2.filter2D 함수를 이용하여 임의의 이미지에 적용해보시오. 이 때, 필터의 크기/분산은 자유롭게 정해보시오.
2‐3. 임의의 이미지에 Salt and Pepper Noise를 추가하고, 앞서 구현한 Average Filter, Sharpening Filter, Gaussian Filter를 적용해보시오.
2‐4. 앞서 Salt and Pepper Noise가 추가된 이미지에 cv2.medianBlur 함수를 이용하여 Median Filter를 적용시켜 보시오. 그리고, 2‐3에서의 Filter들의 결과와 비교해보시오.

[문제 3. Image Pyramids (25 pts)]

3‐1. 임의의 이미지를 가지고, OpenCV Library의 cv2.resize 함수를 이용하여 Up‐sampling과 Down‐sampling을 적용해보시오. 이 때, Interpolation의 여러 방식(예를 들어, Bi‐linear, Cubic 등)을 적용시켜 보고 결과에 대한 비교를 설명해보시오.
3‐2. 임의의 이미지를 가지고 OpenCV Library의 의 pyrDown 함수를 이용하여 Gaussian Pyramid 를 구성해보시오. 그리고, 이미지들의 퀄리티와 용량을 비교해보시오.
크기가 각자 58kb / 18kb / 6kb 로 down_scale 된 이미지들의 사이즈도 변했음을 확인할 수 있었습니다.

[문제 4. Median Blur 직접 구현 (30 pts)]

4‐1. 앞서 적용해보았던 Median Blur를 Numpy 라이브러리를 활용하여 직접 구현해보시오. 이 때, np.sort와 같은 sort를 위한 모든 라이브러리 사용이 가능합니다. 단, cv2.medianBlur()는 사용하지 않고 구현해보시오. 다만, 결과를 검증하기 위하여 cv2.medianBlur() 결과와 직접 구현한 결과를 비교해보시오.

assignment guide에 따라서 sort를 사용하는데, 채널이 3일 경우 (color image일 경우)
temp.sort에서 에러가 나는 현상이 있었고
color image에 맞는 (channel이 3인 경우)는 구현을 하지 못했습니다.
그래서 회색조 이미지로 컨버팅했습니다.